import { createRouter, createWebHistory } from 'vue-router'
import { useUserStore } from '@/stores/user'
import { saveVisitHistory } from '@/utils/visitHistory'

/**
 * 动态加载所有路由模块
 * 使用 Vite 的 import.meta.glob 自动导入 modules 目录下的所有路由文件
 * 这样添加新模块时不需要手动修改此文件，只需在 modules 目录下创建新的路由文件即可
 */
function loadRouteModules() {
  const moduleFiles = import.meta.glob('./modules/*.js', { eager: true })
  const modules = []
  
  // 遍历所有模块文件
  Object.keys(moduleFiles).forEach(path => {
    const module = moduleFiles[path]
    const routes = module.default || []
    
    if (Array.isArray(routes) && routes.length > 0) {
      modules.push(...routes)
      console.log(`✅ 已加载路由模块: ${path}`)
    }
  })
  
  console.log(`📦 共加载 ${Object.keys(moduleFiles).length} 个路由模块，${modules.length} 条路由`)
  return modules
}

// 加载所有动态路由模块
const dynamicRoutes = loadRouteModules()

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      redirect: '/dashboard'
    },
    // Win10 桌面
    {
      path: '/win10/desktop',
      name: 'Win10Desktop',
      component: () => import('@/views/win10/Desktop.vue'),
      meta: { title: 'Win10桌面', requiresAuth: true }
    },
    // Win10 桌面调试页面
    {
      path: '/win10/desktop-debug',
      name: 'Win10DesktopDebug',
      component: () => import('@/views/win10/Desktop.vue'),
      meta: { title: '桌面调试', requiresAuth: false, layout: 'blank' }
    },
    // 动态加载的所有模块路由
    ...dynamicRoutes,
    // 测试演示页面
    {
      path: '/test-demo',
      name: 'TestDemo',
      component: () => import('@/views/TestDemo.vue'),
      meta: { title: '功能测试', requiresAuth: false }
    },
    // 智能导航测试页面
    {
      path: '/test/smart-nav',
      name: 'SmartNavTest',
      component: () => import('@/views/test/SmartNavTest.vue'),
      meta: { title: '智能导航测试', requiresAuth: false }
    },
    // 导航调试页面
    {
      path: '/debug/navigation',
      name: 'NavigationDebug',
      component: () => import('@/views/debug/NavigationDebug.vue'),
      meta: { title: '导航调试', requiresAuth: false }
    }
  ]
})

// 路由守卫 - 全局检查登录状态
router.beforeEach((to, from, next) => {
  // 从 localStorage 获取 token
  const token = localStorage.getItem('token')
  const sessionId = localStorage.getItem('sessionId')

  // 白名单：不需要登录就能访问的页面
  const whiteList = ['/login', '/register', '/forgot-password', '/test-demo', '/test/smart-nav', '/debug/navigation']

  // 设置页面标题
  document.title = to.meta.title ? `${to.meta.title} - Big ERP` : 'Big ERP 企业管理系统'

  // 判断是否需要登录（检查 token 或 sessionId）
  const isLoggedIn = !!(token || sessionId)

  if (isLoggedIn) {
    // 已登录
    if (to.path === '/login') {
      // 已登录，访问登录页，重定向到默认首页
      next('/dashboard')
    } else {
      // 正常访问，验证用户信息是否存在
      const userInfo = localStorage.getItem('userInfo')
      if (!userInfo) {
        // token 存在但用户信息丢失，重新登录
        console.warn('用户信息丢失，需要重新登录')
        localStorage.removeItem('token')
        localStorage.removeItem('sessionId')
        next(`/login?redirect=${encodeURIComponent(to.fullPath)}`)
      } else {
        next()
      }
    }
  } else {
    // 未登录
    if (whiteList.includes(to.path)) {
      // 在白名单中，放行
      next()
    } else {
      // 不在白名单，跳转到登录页，并记录目标路径
      console.log('用户未登录，跳转到登录页')

      // 记录用户尝试访问的页面，登录后可以返回
      const redirect = to.fullPath

      if (redirect === '/' || redirect === '/dashboard') {
        // 首页和仪表盘不需要记录重定向
        next('/login')
      } else {
        // 其他页面记录重定向路径
        next(`/login?redirect=${encodeURIComponent(redirect)}`)
      }
    }
  }
})

// 路由守卫 - 记录访问历史和加载状态
router.afterEach((to, from) => {
  // 只有在用户已登录且访问的是有效页面时才记录
  const token = localStorage.getItem('token')
  const sessionId = localStorage.getItem('sessionId')
  const isLoggedIn = !!(token || sessionId)

  if (isLoggedIn && to.path !== '/login' && to.path !== '/register' && to.path !== '/forgot-password') {
    // 延迟记录，确保页面已经加载
    setTimeout(() => {
      try {
        saveVisitHistory(to)
      } catch (error) {
        console.error('保存访问历史失败:', error)
      }
    }, 100)
  }

  // 页面加载完成后，移除加载状态
  setTimeout(() => {
    const loadingElement = document.getElementById('app-loading')
    if (loadingElement) {
      loadingElement.style.display = 'none'
    }
  }, 300)
})

export default router
